package muhnes.sizoo.dal;

import java.util.List;
import muhnes.sizoo.HibernateUtilZoologia;
import muhnes.sizoo.modelo.Clase;
import org.hibernate.Query;
import org.hibernate.Session;

/**
 * Clase que implementa los metodos declarados en ClaseDao.
 * @author Ricardo Orellana
 */
public class ClaseDaoImpl extends GenericoDAO< Clase, Integer >  implements ClaseDao {
        
    public ClaseDaoImpl() {
        super( HibernateUtilZoologia.getSessionFactory() );
    }
    
    @Override
    protected Class<?> getClaseEntidad () {
        return Clase.class;
    }
    
    /**
     * Método que devuelve una lista de clases que se encuentren habilitadas.
     *  
     */
    @Override
    public List< Clase > buscarHabilitados () {
        Session sesion = fabricaSesion.getCurrentSession();        
        String hql = "from Clase where habilitado = 'true'";
        Query consulta = sesion.createQuery( hql );
        List< Clase > entidades = consulta.list();
        return entidades;
    }

    /**
     * Metodo que verifica si la entidad esta repetida o no
     * 
     */
    @Override
    public boolean verificarUnicidad(Clase entidad) {
        Session sesion = fabricaSesion.getCurrentSession();        
        String hql = "from Clase where codigoclase != :codigo " +
                     "and (upper(nombre) = :nombre " +
                     "and upper(subclase) = :subclase " +
                     "and upper(infraclase) = :infraclase)";
        Query consulta = sesion.createQuery( hql );
        consulta.setParameter("codigo", entidad.getCodigoclase());
        consulta.setParameter("nombre", entidad.getNombre().toUpperCase());
        consulta.setParameter("subclase", entidad.getSubclase().toUpperCase());
        consulta.setParameter("infraclase", entidad.getInfraclase().toUpperCase());
        return consulta.uniqueResult() != null ? true : false;
    }

    /**
     * Metodo que verifica si la entidad depende de otra o no
     * 
     */
    @Override
    public boolean verificarDependencia (Clase entidad) {
        Session sesion = fabricaSesion.getCurrentSession();        
        String hql = "from Orden where clase.codigoclase = :codigo";
        Query consulta = sesion.createQuery( hql );
        consulta.setParameter("codigo",entidad.getCodigoclase());
        return !consulta.list().isEmpty();
    }

}
